package com.nervenets.general.service;

import com.nervenets.general.hibernate.TreeDomainObject;
import com.nervenets.general.web.params.TreeQueryParams;

import java.util.List;

/**
 * 2020/6/30 12:08 created by Joe
 **/
public interface TreeService<T extends TreeDomainObject<T>> extends CacheableService<T> {
    /**
     * 查询所有父级
     *
     * @param id 节点ID
     * @return 父级列表
     */
    List<T> findParentsById(long id, boolean reversed);

    /**
     * 查询所有直属子级
     *
     * @param parentId 节点ID
     * @return 直属子级列表
     */
    List<T> findChildrenByParentId(long parentId);

    /**
     * 查询所有直属子级数量
     *
     * @param parentId 节点ID
     * @return 直属子级列表
     */
    long countChildrenByParentId(long parentId);

    /**
     * 查询所有子级（包含直属的所有下级）
     *
     * @param parentId 节点ID
     * @return 子级列表
     */
    List<T> findAllChildrenByParentId(long parentId);

    /**
     * 查询所有直属子级数量（包含直属的所有下级）
     *
     * @param parentId 节点ID
     * @return 直属子级列表
     */
    long countAllChildrenByParentId(long parentId);

    /**
     * 获取树结构
     */
    <TQP extends TreeQueryParams<T>> List<T> getTrees(TQP params);
}
